package br.com.clubelivro.mb;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.AjaxBehaviorEvent;

import org.primefaces.model.DualListModel;

import br.com.clubelivro.bo.iface.IClubeLivroBO;
import br.com.clubelivro.bo.iface.IPagamentoBO;
import br.com.clubelivro.modelo.Pagamento;
import br.com.clubelivro.modelo.Socio;
import br.com.gaspar.framework.visao.jsf.ManagedBeanBase;
import br.com.gaspar.utils.ColecaoUtil;
import br.com.gaspar.utils.exception.BaseException;

@ManagedBean(name="PagamentoMB")
@SessionScoped
public class PagamentoMB extends ManagedBeanBase<Pagamento> {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	@EJB
	private IPagamentoBO bo;
	
	@EJB
	private IClubeLivroBO<Socio> socioBO;
	
	private DualListModel<Socio> socios;
	
	private List<Socio> listaSocio;
	
	private Socio socioPesquisa;
	
	@Override
	protected IPagamentoBO getFachada() {
		return bo;
	}

	@Override
	protected void criarAntes() throws BaseException {
		entidade = new Pagamento();
		Calendar c =  Calendar.getInstance();
		entidade.setMes(c.get(Calendar.MONTH));
		entidade.setAno(c.get(Calendar.YEAR));
		
		List<Socio> lista = socioBO.buscarTodosPorNamedQuery("Socio.buscarAtivos");
		List<Socio> sociosSelecionados = new ArrayList<Socio>();
		setSocios(new DualListModel<Socio>(lista, sociosSelecionados));
	}
	
	@PostConstruct
	@Override
	public void iniciar() {
		try {
			listaSocio = socioBO.buscarTodosPorNamedQuery("Socio.buscarAtivos");
			lista = bo.buscarTodosPorNamedQuery("Pagamento.buscarPorSocio", getListaSocio().get(0).getId());
			 
		} catch (BaseException e) {
			e.printStackTrace();
		}
	}

	public List<Socio> getListaSocio() {
		return listaSocio;
	}

	public void setListaSocio(List<Socio> listaSocio) {
		this.listaSocio = listaSocio;
	}

	@Override
	public String gravar() {
		try {
			gravarAntes();

			if(ColecaoUtil.ehNuloOuVazio(getSocios().getTarget())){
				FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
						"Obrigatório informar os sócios!", null);
				FacesContext.getCurrentInstance().addMessage(null, message);
				if (entidade.getId() == null) {
					return EDITAR;
				}	
			}
			
			List<Pagamento> retorno = bo.gravarPagamento(getSocios().getTarget(), getEntidade());
			getLista().addAll(retorno);
						
			gravarApos();
			
		} catch (BaseException e) {
			FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
					"Erro ao gravar!!", null);
			FacesContext.getCurrentInstance().addMessage(null, message);
			if (entidade.getId() == null) {
				return EDITAR;
			}
		}

		FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO,
				"Gravado com sucesso!!", null);
		FacesContext.getCurrentInstance().addMessage(null, message);

		return LISTAR;
		
	}

	public Socio getSocioPesquisa() {
		return socioPesquisa;
	}

	public void setSocioPesquisa(Socio socioPesquisa) {
		this.socioPesquisa = socioPesquisa;
	}
	
	public void pesquisar(AjaxBehaviorEvent abe){
		if(getSocioPesquisa() != null){
			try {
				setLista(null);
				setLista(new ArrayList<Pagamento>());
				getLista().addAll(bo.buscarTodosPorNamedQuery("Pagamento.buscarPorSocio", getSocioPesquisa().getId()));
			} catch (BaseException e) {
				e.printStackTrace();
			}
		}
	}
	
	public DualListModel<Socio> getSocios() {
		return socios;
	}

	public void setSocios(DualListModel<Socio> socios) {
		this.socios = socios;
	}
}
